/**
 * @file MySQLClient.hpp
 * @brief MySQL数据库客户端类的声明
 * @details 封装了MySQL C API，提供数据库连接和查询操作
 */

#ifndef __MySQLClient_HPP__
#define __MySQLClient_HPP__

#include "logger.hpp"
#include <mysql/mysql.h>
#include <string>
#include <vector>
using std::string;
using std::vector;

namespace wd
{
/**
 * @class MySQLClient
 * @brief MySQL数据库客户端
 * @details 封装MySQL连接和查询操作，支持读写操作
 */
class MySQLClient
{
public:
    MySQLClient();
    ~MySQLClient();
    
    /**
     * @brief 连接数据库
     * @param host 主机地址
     * @param port 端口号
     * @param user 用户名
     * @param passwd 密码
     * @param db 数据库名
     * @return 成功返回true，失败返回false
     */
    bool connect(const string & host,
                 unsigned short port,
                 const string & user,
                 const string & passwd,
                 const string & db);
    
    /**
     * @brief 执行写操作查询（INSERT/UPDATE/DELETE）
     * @param sql SQL语句
     * @return 成功返回true，失败返回false
     */
    bool writeOperationQuery(const string & sql);
    
    /**
     * @brief 执行读操作查询（SELECT）
     * @param sql SQL语句
     * @return 查询结果的二维字符串数组
     */
    vector<vector<string>> readOperationQuery(const string & sql);
    
    /**
     * @brief 打印查询结果
     * @param res 查询结果
     */
    static void dump(const vector<vector<string>> & res);
    
    /**
     * @brief 获取用户的加密设置（盐值）
     * @param name 用户名
     * @return 加密设置字符串
     */
    string getSetting(const string & name);
    
    /**
     * @brief 获取加密后的密码
     * @param setting 加密设置
     * @return 加密密码
     */
    string getEncrypt(const string & setting);
    
    /**
     * @brief 检查用户名是否存在
     * @param name 用户名
     * @return 存在返回true，不存在返回false
     */
    bool hasName(const string &name);
    
private:
    /**
     * @brief 初始化MySQL连接
     */
    void init();
    
private:
    MYSQL _conn;  ///< MySQL连接对象
};
}//end of namesapce wd

#endif
